/*
 主要练习符号重载，友元函数，显示类型转换
 1. Time的+，- *
 2. 乘法支持数字在前面
 3. 调用cout << 时输出合适的信息
*/
#ifndef MYTIME3_H_
#define MYTIME3_H_
#include <iostream>

class Time {
    private:
        int hour;
        int minute;
        void adjustHourAndMinute(int &h, int &m);
    public:
        Time();
        Time(int hour = 0, int minute = 0);
        ~Time();
        void addHour(const int hour);
        void addMinute(const int minute);
        // 重载操作符: 
        // 重载操作符的格式为: 返回值 operator符号( 参数列表 )
        // 也就是说相当于把方法名字改成了 operator符号
        const Time operator+(const Time & aTime);
        const Time operator-(const Time & aTime);
        // 这样只能是Time * 2 这样的形式
        const Time operator*(const int num);
        // 要想实现 2 * Time，还要设置友元函数，然后将int设置为朋友
        // 因为上面的乘法操作符不是const方法，所以这的aTime也不能是const的，否则就会编译失败
        // error: invalid operands to binary expression ('const Time' and 'const int')
        // 友元函数不是成员函数，所以其内部不能直接获取到当前对象的成员，所以要加一个类型为Time的形参
        friend const Time operator*(const int num, Time aTime)
        {
            return aTime * num;
        }
        // 使用友元函数重载 << 操作符，让cout << Time变得容易

        // !!让某个操作符认识一个类的方法：使用友元函数做重载
        // !!友元其实就是把自己的信息告诉别人，然后让别人给自己实现一个方法来使用
        // https://en.cppreference.com/w/cpp/language/friend
        friend std::ostream & operator<<(std::ostream &out, Time &aTime);
        void show() const;
};
#endif
